package com.wh.maker.template;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import com.wh.maker.template.enums.FileFilterRangeEnum;
import com.wh.maker.template.enums.FileFilterRuleEnum;
import com.wh.maker.template.model.FileFilterConfig;

import java.io.File;
import java.util.List;
import java.util.stream.Collectors;


/**
 * 文件过滤器
 *
 * @author wanghui
 * @since 2022/5/23
 */
public class FileFilter {


    /**
     * 单个文件过滤
     * @param fileFilterConfigs  传入文件过滤器列表
     * @param file   传入单个文件
     * @return  布尔值，满足过滤条件为真
     */
    public static boolean doSingleFileFilter(List<FileFilterConfig> fileFilterConfigs, File file) {
        String fileName = file.getName();
        String fileContent = FileUtil.readUtf8String(file);

        //所有过滤器校验结束的结果
        boolean result = true;
        if (CollUtil.isEmpty(fileFilterConfigs)) {
            return true;
        }

        for (FileFilterConfig fileFilterConfig : fileFilterConfigs) {
            String range = fileFilterConfig.getRange();
            String rule = fileFilterConfig.getRule();
            String value = fileFilterConfig.getValue();

            FileFilterRangeEnum fileFilterRangeEnum = FileFilterRangeEnum.getEnumByValue(range);
            if (fileFilterRangeEnum == null) {
                continue;
            }

            //要过滤的内容
            String content = fileName;
            switch (fileFilterRangeEnum) {
                case FILE_NAME:
                    content = fileName;
                    break;
                case FILE_CONTENT:
                    content = fileContent;
                    break;
                default:
                    break;
            }

            FileFilterRuleEnum fileFilterRuleEnum = FileFilterRuleEnum.getEnumByValue(rule);
            if (fileFilterRuleEnum == null) {
                continue;
            }
            switch (fileFilterRuleEnum) {
                case CONTAINS:
                    result = content.contains(value);
                    break;
                case STARTS_WITH:
                    result = content.startsWith(value);
                    break;
                case ENDS_WITH:
                    result = content.endsWith(value);
                    break;
                case REGEX:
                    result = content.matches(value);
                    break;
                case EQUALS:
                    result = content.equals(value);
                    break;
                default:
                    break;
            }

            if (!result) return false;
        }
        return true;
    }


    /**
     * 文件过滤
     * @param filePath   传入文件目录绝对路径并遍历
     * @param fileFilterConfigs  传入过滤器列表，对该目录下所有文件进行过滤
     * @return  返回过滤后的文件列表
     */
    public static List<File> doFilter(String filePath, List<FileFilterConfig> fileFilterConfigs) {
        //根据路径获取所有文件
        List<File> files = FileUtil.loopFiles(filePath);
        return files.stream()
                .filter(file -> doSingleFileFilter(fileFilterConfigs, file))
                .collect(Collectors.toList());
    }
}
